home *** CD-ROM | disk | FTP | other *** search
- /*
-
- TEPeste
-
- Joshua Juran
-
- */
-
- #include <string.h>
-
- #include <Events.h>
- #include <Resources.h>
- #include <Sound.h>
- #include <TextEdit.h>
-
- // Needed for globals
- #include <A4Stuff.h>
-
- #define _TEPaste 0xA9DB
-
- //static pascal short PatchedGetNextEvent(EventMask, EventRecord *theEvent);
- static pascal void PatchedTEPaste(TEHandle hTE);
-
- //typedef pascal short (*GetNextEventProcPtr)(EventMask, EventRecord *);
- //static GetNextEventProcPtr origGetNextEvent;
- typedef pascal void (*TEPasteProcPtr)(TEHandle);
- static TEPasteProcPtr origTEPaste;
-
- static short gLastTimeWasAGag;
-
- static short CheckLastTime()
- {
- long oldA4;
- short result;
-
- oldA4 = SetCurrentA4();
-
- result = gLastTimeWasAGag;
-
- SetA4(oldA4);
-
- return result;
- }
-
- static void UpdateLastTime(short inThisTimeWasAGag)
- {
- long oldA4;
-
- oldA4 = SetCurrentA4();
-
- gLastTimeWasAGag = inThisTimeWasAGag;
-
- SetA4(oldA4);
- }
-
- static short ShouldDoAGag()
- {
- if (CheckLastTime()) {
- return 0;
- } else {
- return (TickCount() & 3) == 0;
- }
- }
-
- static const char *PickAGag(short which)
- {
- switch (which) {
- case 0:
- return "Boo!";
- break;
- case 1:
- return "Whazzuuup!";
- break;
- case 2:
- return "Nobody expects the Spanish Inquisition!";
- break;
- case 3:
- return "You REALLY ought to get some sleep...";
- break;
- case 4:
- return "• Vote for Joshua Juran •";
- break;
- }
- }
-
- static void Payload(TEHandle hTE)
- {
- const char *gag = PickAGag(TickCount() % 5);
- long len = strlen(gag);
- long start = (**hTE).selStart;
-
- SysBeep(0);
- TEDelete(hTE);
- TEInsert(gag, len, hTE);
- TESetSelect(start, start + len, hTE);
-
- start = TickCount();
- while (TickCount() < start + 30) {
-
- }
- origTEPaste(hTE);
- }
-
- static pascal void PatchedTEPaste(TEHandle hTE)
- {
- long oldA4;
-
- oldA4 = SetCurrentA4();
-
- if (ShouldDoAGag()) {
- Payload(hTE);
- UpdateLastTime(1);
- } else {
- origTEPaste(hTE);
- UpdateLastTime(0);
- }
-
- SetA4(oldA4);
- }
-
- static ProcPtr ApplyTrapPatch(short trap, ProcPtr patchPtr)
- {
- ProcPtr trapPtr;
-
- if (patchPtr == nil)
- return nil;
-
- trapPtr = NGetTrapAddress (trap, (trap & 0x0800) ? ToolTrap : OSTrap);
- NSetTrapAddress (patchPtr, trap, (trap & 0x0800) ? ToolTrap : OSTrap);
- return trapPtr;
- }
-
- void main(void)
- {
- long oldA4;
- UniversalProcPtr procPtr;
- Handle initCode = nil;
- THz oldZone;
-
- oldA4 = SetCurrentA4();
-
- oldZone = GetZone();
- SetZone(SystemZone());
-
- initCode = (Handle)Get1Resource('INIT', 0);
- if (initCode == nil)
- goto failure;
-
- DetachResource(initCode);
- if (ResError() != noErr)
- goto failure;
-
- HLockHi(initCode);
- HNoPurge(initCode);
-
- procPtr = ApplyTrapPatch( _TEPaste, (ProcPtr)(PatchedTEPaste) );
- origTEPaste = (TEPasteProcPtr)procPtr;
-
- failure:
- SetZone(oldZone);
- SetA4(oldA4);
- }
-